// 后台配置管理模块的接口注入
package xginxgodb

import (
	"fmt"
	"time"

	"gitee.com/xiaoyutab/xgotool/optional/xlog"
	"gitee.com/xiaoyutab/xgotool/xgin"
	"gitee.com/xiaoyutab/xgotool/xgodb"
	"gitee.com/xiaoyutab/xgotool/xgodb/xgodbconfig"
	"github.com/gin-gonic/gin"
)

// 注入配置项
//
//	r	配置项路由组，会在该组下注入一系列的路由信息
//	c	xgodb模组配置项，如果提前注入了此处可以传nil
//	sp	同步配置项的上级菜单分组【可选参数，空表示不同步，传入的话会将配置项归属到该分组下】
//
// PS: 此服务使用了 c.GetUint("uid")>0 的鉴权，所以注入时请先在其他中间件中将uid设置到c变量中
// PS2: 此服务注入了"FRAM_SYNC_URL", "FRAM_SYNC_URL_AES", "FRAM_SYNC_DOMAIN", "FRAM_SYNC_DOMAIN_AES"配置项用于配置项的同步，且此四项任意项为空均不会同步，所以建议正确进行配置
func Regedit(r *gin.RouterGroup, c *xgodb.Config, sp ...string) {
	if c != nil {
		old_fun := c.ConfigEdit
		c.ConfigEdit = func(name string) error {
			if old_fun != nil {
				err := old_fun(name)
				if err != nil {
					xlog.Alert("配置项变更回调失败", err)
				}
			}
			return config_edit(name)
		}
	} else {
		c = &xgodb.Config{
			ConfigEdit: config_edit,
		}
	}
	xgodb.Regedit(c)
	if len(sp) > 0 {
		// 注入配置项
		xgodbconfig.InsertsOrContinue([]xgodbconfig.Configure{
			{NameKey: "FRAM_SYNC_URL", NameCn: "同步网址", NameGroup: sp[0], Types: "string", Desc: "配置项的同步地址，配置时请配置正确的 域名/此服务前缀路由/sync.configure.xgin 【PS：sync.configure.xgin为固定尾缀，多条使用 , 拼接】", ValueBool: 0, ValueString: "", ValueInt: 0, ValueFloat: 0, EnumSelect: ""},
			{NameKey: "FRAM_SYNC_URL_AES", NameCn: "同步密钥", NameGroup: sp[0], Types: "string", Desc: "对应每个同步域名的AES密钥，限制长度为16、24、32英文字符串，多个使用 , 拼接【PS：需和对应域名提供方确定好AES密钥，此密钥为对方的 FRAM_SYNC_DOMAIN_AES 的配置项值】", ValueBool: 0, ValueString: "", ValueInt: 0, ValueFloat: 0, EnumSelect: ""},
			{NameKey: "FRAM_SYNC_DOMAIN", NameCn: "我方配置网址", NameGroup: sp[0], Types: "string", Desc: "我方配置网址，同步时会传入此域名，以便对方确定该域名是否在对方同步列表中", ValueBool: 0, ValueString: "", ValueInt: 0, ValueFloat: 0, EnumSelect: ""},
			{NameKey: "FRAM_SYNC_DOMAIN_AES", NameCn: "我方配置密钥", NameGroup: sp[0], Types: "string", Desc: "我方配置密钥，传递给其他方时会使用此密钥进行加密。限制长度为16、24、32个英文字符串", ValueBool: 0, ValueString: "", ValueInt: 0, ValueFloat: 0, EnumSelect: ""},
		})
		// 注入同步接口
		r.GET("sync.configure.xgin", xgin.Convert(syncGet))   // 配置项同步接口【获取列表】
		r.POST("sync.configure.xgin", xgin.Convert(syncPost)) // 配置项同步接口【变更推送】
		// 同步依赖
		go func() {
			fmt.Println("休眠2秒后即开始同步配置信息")
			time.Sleep(time.Second * 2)
			sync_config()
		}()
	}
	r.Use(xgin.MustLogin)
	r.GET("get.group", xgin.Convert(getGroup))          // 获取配置项分组
	r.GET("get.configure", xgin.Convert(getConfigure))  // 获取配置项详情
	r.POST("set.configure", xgin.Convert(setConfigure)) // 设置配置项详情信息
}
